// 用法如下:
function fn1 (x) {
  return x + 1;
}
function fn2 (x) {
  return x + 2;
}
function fn3 (x) {
  return x + 3;
}
function fn4 (x) {
  return x + 4;
}

// function compose () {
//   let args = [...arguments] // 接受参数 应该都是数组
//   return function (arg) {
//     while (args.length) {
//       arg = args.pop()(arg) // 调用一下
//     }
//     return arg
//   }
// }
function compose (...funcs) {
  if (!funcs.length) return (v) => v; // 如果没有传入函数 直接返回一个返回该参数的函数

  if (funcs.length === 1) { // 如果是1,直接返回这个的调用
    return funcs[0]
  }

  return funcs.reduce((a, b) => {
    return (...args) => a(b(...args))
  }) // 否则的话利用reduce方法 redece的第一个参数是起始的结果,如果没有就是函数的调用第一次的结果
}


const a = compose(fn1, fn2, fn3, fn4);
// console.log(a.toString())
console.log(a(1)); // 1+4+3+2+1=11
